package cn.iocoder.yudao.module.reading.service.category;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.reading.controller.admin.category.vo.CategoryCreateReqVO;
import cn.iocoder.yudao.module.reading.controller.admin.category.vo.CategoryPageReqVO;
import cn.iocoder.yudao.module.reading.controller.admin.category.vo.CategoryUpdateReqVO;
import cn.iocoder.yudao.module.reading.dal.dataobject.category.CategoryDO;
import cn.iocoder.yudao.module.reading.dal.mysql.category.CategoryMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import jakarta.annotation.Resource;
import jakarta.validation.Valid;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.reading.enums.ErrorCodeConstants.*;
import java.util.List;

/**
 * 绘本分类 Service 实现类
 *
 * @author 芋道源码
 */
@Service
@Validated
@Slf4j
public class CategoryServiceImpl implements CategoryService {

    @Resource
    private CategoryMapper categoryMapper;

    @Override
    public List<CategoryDO> getActiveCategories() {
        return categoryMapper.selectActiveCategories();
    }

    @Override
    public List<CategoryDO> getActiveCategoriesByLanguage(String language) {
        return categoryMapper.selectActiveCategoriesByLanguage(language);
    }

    @Override
    public CategoryDO getCategory(Long id) {
        return categoryMapper.selectById(id);
    }

    @Override
    public CategoryDO getCategoryByName(String name) {
        return categoryMapper.selectByName(name);
    }

    // ==================== Admin 管理相关 ====================

    @Override
    public Long createCategory(@Valid CategoryCreateReqVO createReqVO) {
        // 校验分类名称唯一性
        validateCategoryNameUnique(null, createReqVO.getName(), createReqVO.getLanguage());

        // 插入
        CategoryDO category = BeanUtils.toBean(createReqVO, CategoryDO.class);
        categoryMapper.insert(category);

        // 返回
        return category.getId();
    }

    @Override
    public void updateCategory(@Valid CategoryUpdateReqVO updateReqVO) {
        // 校验存在
        validateCategoryExists(updateReqVO.getId());

        // 校验分类名称唯一性
        validateCategoryNameUnique(updateReqVO.getId(), updateReqVO.getName(), updateReqVO.getLanguage());

        // 更新
        CategoryDO updateObj = BeanUtils.toBean(updateReqVO, CategoryDO.class);
        categoryMapper.updateById(updateObj);
    }

    @Override
    public void deleteCategory(Long id) {
        // 校验存在
        validateCategoryExists(id);

        // 校验是否有绘本集使用该分类
        // TODO: 添加绘本集关联校验

        // 删除
        categoryMapper.deleteById(id);
    }

    @Override
    public PageResult<CategoryDO> getCategoryPage(CategoryPageReqVO pageReqVO) {
        return categoryMapper.selectPage(pageReqVO);
    }

    private void validateCategoryExists(Long id) {
        if (categoryMapper.selectById(id) == null) {
            throw exception(CATEGORY_NOT_EXISTS);
        }
    }

    private void validateCategoryNameUnique(Long id, String name, String language) {
        CategoryDO category = categoryMapper.selectByNameAndLanguage(name, language);
        if (category == null) {
            return;
        }
        // 如果 id 为空，说明不用比较是否为相同 id 的分类
        if (id == null) {
            throw exception(CATEGORY_NAME_DUPLICATE);
        }
        if (!category.getId().equals(id)) {
            throw exception(CATEGORY_NAME_DUPLICATE);
        }
    }

}
